tests: Fix the iter stepping code
authorBenjamin Otte <otte@redhat.com>
Fri, 25 Nov 2011 19:54:48 +0000 (20:54 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 29 Nov 2011 19:44:57 +0000 (20:44 +0100)
The old code actually was wrong and could cause assertions and crashes,
in particular when stepping out of a deep tree back onto the highest
layer.

tests/testtreechanging.c

index e5ab82b5a6076ed558ba0cc1808120c096f19e17..27a9d4aab1ede38eeb577631d43f45df23a4dadf 100644 (file)
@@ -57,31 +57,52 @@ get_rows (GtkTreeView *treeview)
   return GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (treeview), "rows"));
 }
 
+/* moves iter to the next iter in the model in the display order
+ * inside a treeview. Returns FALSE if no more rows exist.
+ */
+static gboolean
+tree_model_iter_step (GtkTreeModel *model,
+                      GtkTreeIter *iter)
+{
+  GtkTreeIter tmp;
+  
+  if (gtk_tree_model_iter_children (model, &tmp, iter))
+    {
+      *iter = tmp;
+      return TRUE;
+    }
+
+  do {
+    tmp = *iter;
+
+    if (gtk_tree_model_iter_next (model, iter))
+      return TRUE;
+    }
+  while (gtk_tree_model_iter_parent (model, iter, &tmp));
+
+  return FALSE;
+}
+
 static void
 delete (GtkTreeView *treeview)
 {
   guint n_rows = get_rows (treeview);
   guint i = g_random_int_range (0, n_rows);
   GtkTreeModel *model;
-  GtkTreeIter iter, next;
+  GtkTreeIter iter;
 
   model = gtk_tree_view_get_model (treeview);
   
   if (!gtk_tree_model_get_iter_first (model, &iter))
     return;
 
-
   while (i-- > 0)
     {
-      next = iter;
-      if (!gtk_tree_model_iter_children (model, &iter, &next) &&
-          !gtk_tree_model_iter_next (model, &next) &&
-          !gtk_tree_model_iter_parent (model, &next, &iter))
+      if (!tree_model_iter_step (model, &iter))
         {
           g_assert_not_reached ();
           return;
         }
-      iter = next;
     }
 
   n_rows -= count_children (model, &iter) + 1;